﻿using Share.Services;
using System.Text.Json.Serialization;

namespace Share.APIs;

#region 请求的 biz_content 部份
public class QHisD : IcbcApiRequest
{
    /// <summary>
    /// 接口地址
    /// </summary>
    internal override string Url => "api/mybank/enterprise/trade/qhisd/V1";

    [JsonPropertyName("trans_code")] public string TransCode => "QHISD"; //交易代码
    [JsonPropertyName("tran_date")] public string TranDate { get; set; } = DateTime.Now.ToString("yyyyMMdd"); //交易日期：ERP系统产生，格式是yyyyMMdd
    [JsonPropertyName("tran_time")] public string TranTime { get; set; } = DateTime.Now.ToString("HHmmssfff"); //交易时间：ERP系统产生，格式如HHmmssSSS，精确到毫秒
    [JsonPropertyName("language")] public string? Language { get; set; } = "zh_CN";//语言：zh_CN简体中文，en_US英文，默认zh_CN
    [JsonPropertyName("f_seq_no")] public string FSeqNo { get; set; } = UtilitiesService.GetFSeqNo(); //指令包序列号：ERP系统产生，一个集团永远不能重复
    [JsonPropertyName("account_no")] public string AccountNo { get; set; } = string.Empty; //查询账号：该接口能查询的企业账号必须已在内部管理系统中成功注册;对于本行FT类账户，支持账号前加FT类标志的上送；对于本行H、HNRA账户，支持账号前加H、HNRA标志的上送；
    [JsonPropertyName("begin_date")] public string BeginDate { get; set; } = string.Empty; //起始日期：起始日期必须小于等于截止日期,且起始日期加最长时间跨度不得早于当日;最长时间跨度为6个月；本行往来户可查最近21个月内，其他可查最近6个月内；格式是yyyyMMdd;
    [JsonPropertyName("end_date")] public string? EndDate { get; set; } = string.Empty; //截止日期：起始日期必须小于等于截止日期,且结束日期必须小于等于当天日期;最长时间跨度为6个月；本行往来户可查最近21个月内，其他可查最近6个月内；格式是yyyyMMdd;
    [JsonPropertyName("min_amount")] public decimal? MinAmount { get; set; }  //发生额下限：若输入则为正数,不能大于发生额上限;
    [JsonPropertyName("max_amount")] public decimal? MaxAmount { get; set; } //发生额上限：若输入则为正数，单位为分.发生额上下限都有值时则下限必须小于等于上限;
    [JsonPropertyName("bank_type")] public string? BankType { get; set; } //行别：无需输入，如输入，则忽略（若上送，仅对字段长度进行合法性校验）
    [JsonPropertyName("next_tag")] public string? NextTag { get; set; } = string.Empty; //查询下页标识：当单页不能返回全部记录时，由客户指令通过“查询下页标识”指定页码进行分包返回；“查询下页标识”由银行在上次查询时返回给客户，提供客户下次查询时使用；如果“查询下页标识”返回为空，则标识没有后续明细记录；查询首页上送空；其他页需与银行返回包提供的一致;
    [JsonPropertyName("currency")] public string? Currency { get; set; } = "CNY"; //币种：1、多币种账户、FT账户必输；2、单币种账户选输，不输则以系统默认币种为准；
    [JsonPropertyName("due_bill_no")] public string? DueBillNo { get; set; }  //借据编号：贷款户可选输该字段，其他账户类型无需输入
    [JsonPropertyName("drcrf")] public string? Drcrf { get; set; } = string.Empty; //借贷标志：0、借贷都查询； 1、借；2、贷（非综合帐户）
}
#endregion

#region 响应的 response_biz_content 部份
public class QHisDResponse : IcbcApiResponse
{
    [JsonPropertyName("trans_code")] public string TransCode { get; set; } = string.Empty; //交易代码
    [JsonPropertyName("bank_code")] public string BankCode { get; set; } = string.Empty; //归属银行编号：客户注册时的归属单位
    [JsonPropertyName("login_id")] public string LoginId { get; set; } = string.Empty; //证书ID：无证书客户可上送空
    [JsonPropertyName("tran_date")] public string TranDate { get; set; } = string.Empty; //交易日期：ERP系统产生的交易日期，格式是yyyyMMdd
    [JsonPropertyName("tran_time")] public string TranTime { get; set; } = string.Empty; //交易时间：ERP系统产生的交易时间，格式如HHmmssSSS，精确到毫秒；
    [JsonPropertyName("f_seq_no")] public string FSeqNo { get; set; } = string.Empty; //指令包序列号：ERP系统产生的指令包序列号，一个集团永远不能重复。客户可选择上送或由系统自动生成
    [JsonPropertyName("account_no")] public string AccountNo { get; set; } = string.Empty; //账号：对于本行FT类账户，支持账号前加FT类标志的输出；（托管台账场景返回账号）
    [JsonPropertyName("account_name")] public string AccountName { get; set; } = string.Empty; //户名（托管台账场景返回组合名称）
    [JsonPropertyName("currency")] public string Currency { get; set; } = string.Empty; //币种
    [JsonPropertyName("begin_date")] public string BeginDate { get; set; } = string.Empty; //起始日期
    [JsonPropertyName("end_date")] public string EndDate { get; set; } = string.Empty; //截止日期
    [JsonPropertyName("min_amount")] public decimal MinAmount { get; set; }  //发生额下限
    [JsonPropertyName("max_amount")] public decimal MaxAmount { get; set; }  //发生额上限
    [JsonPropertyName("bank_type")] public string BankType { get; set; } = string.Empty; //行别
    [JsonPropertyName("next_tag")] public string NextTag { get; set; } = string.Empty; //查询下页标识：查询下页标识：若该字段有值，表示还有下一页，在请求参数的next_tag中赋上该值（托管台账场景返回翻页标识）
    [JsonPropertyName("total_num")] public int TotalNum { get; set; }  //交易条数（托管台账场景返回交易条数）
    [JsonPropertyName("due_bill_no")] public string DueBillNo { get; set; } = string.Empty; //借据编号
    [JsonPropertyName("rd")] public List<QHisDResponseRd> Rd { get; set; } = new(); //循环区
}

public class QHisDResponseRd
{
    [JsonPropertyName("drcrf")] public string Drcrf { get; set; } = string.Empty; //借贷标志：数据字典：1-借；2-贷；（托管台账场景返回借贷标志）
    [JsonPropertyName("vouh_no")] public string VouhNo { get; set; } = string.Empty; //凭证号
    [JsonPropertyName("debit_amount")] public decimal DebitAmount { get; set; }  //借方发生额（托管台账场景返回出款金额）
    [JsonPropertyName("credit_amount")] public decimal CreditAmount { get; set; } //贷方发生额（托管台账场景返回入款金额）
    [JsonPropertyName("balance")] public decimal Balance { get; set; }  //余额（托管台账场景返回余额）
    [JsonPropertyName("recip_bk_no")] public string RecipBkNo { get; set; } = string.Empty; //对方行号（托管台账场景返回对方行号）
    [JsonPropertyName("recip_bk_name")] public string RecipBkName { get; set; } = string.Empty; //对方行名（托管台账场景返回对方行名）
    [JsonPropertyName("recip_account_no")] public string RecipAccountNo { get; set; } = string.Empty; //对方账号（托管台账场景返回对方账号）
    [JsonPropertyName("recip_name")] public string RecipName { get; set; } = string.Empty; //对方户名（托管台账场景返回对方账号名称）
    [JsonPropertyName("summary")] public string Summary { get; set; } = string.Empty; //摘要对方账号（托管台账场景返回摘要）
    [JsonPropertyName("use_cn")] public string UseCn { get; set; } = string.Empty; //用途
    [JsonPropertyName("post_script")] public string PostScript { get; set; } = string.Empty; //附言（托管台账场景返回附言）
    [JsonPropertyName("busi_code")] public string BusiCode { get; set; } = string.Empty; //业务代码
    [JsonPropertyName("date")] public string Date { get; set; } = string.Empty; //交易日期（托管台账场景返回交易日期）
    [JsonPropertyName("time")] public string Time { get; set; } = string.Empty; //时间戳（托管台账场景返回交易时间戳）
    [JsonPropertyName("ref")] public string Ref { get; set; } = string.Empty; //业务编号（托管台账场景返回相关编号）
    [JsonPropertyName("oref")] public string Oref { get; set; } = string.Empty; //相关业务编号
    [JsonPropertyName("en_summary")] public string EnSummary { get; set; } = string.Empty; //英文备注
    [JsonPropertyName("busi_type")] public string BusiType { get; set; } = string.Empty; //业务种类
    [JsonPropertyName("vouh_type")] public string VouhType { get; set; } = string.Empty; //凭证种类
    [JsonPropertyName("add_info")] public string AddInfo { get; set; } = string.Empty; //附加信息（托管台账场景返回业务类型）
    [JsonPropertyName("toutfo")] public string Toutfo { get; set; } = string.Empty; //电子回单唯一标识
    [JsonPropertyName("only_sequence")] public string OnlySequence { get; set; } = string.Empty; //银行交易流水号
    [JsonPropertyName("agent_account_name")] public string AgentAccountName { get; set; } = string.Empty; //财务公司二级账户户名（资金池次要对手账号户名）
    [JsonPropertyName("agent_account_no")] public string AgentAccountNo { get; set; } = string.Empty; //财务公司二级账户账号（资金池次要对手账号）
    [JsonPropertyName("up_dtranf")] public string UpDtranf { get; set; } = string.Empty; //冲正标志
    [JsonPropertyName("value_date")] public string ValueDate { get; set; } = string.Empty; //起息日（托管台账场景返回起息日）
    [JsonPropertyName("trx_code")] public string TrxCode { get; set; } = string.Empty; //工行交易代码
    [JsonPropertyName("ref1")] public string Ref1 { get; set; } = string.Empty; //业务编号1
    [JsonPropertyName("oref1")] public string Oref1 { get; set; } = string.Empty; //相关业务编号1
    [JsonPropertyName("cashf")] public string Cashf { get; set; } = string.Empty; //交易类型
    [JsonPropertyName("busi_date")] public string BusiDate { get; set; } = string.Empty; //入账日期（托管台账场景返回入账日期）
    [JsonPropertyName("busi_time")] public string BusiTime { get; set; } = string.Empty; //入账时间（托管台账场景返回入账时间HHmmss）
    [JsonPropertyName("mg_no")] public string MgNo { get; set; } = string.Empty; //保证金编号
    [JsonPropertyName("mg_account_no")] public string MgAccountNo { get; set; } = string.Empty; //保证金缴存账号
    [JsonPropertyName("mg_currency")] public string MgCurrency { get; set; } = string.Empty; //保证金币种
    [JsonPropertyName("cash_exf")] public string CashExf { get; set; } = string.Empty; //钞汇标志
    [JsonPropertyName("detail_no")] public string DetailNo { get; set; } = string.Empty; //明细序号
    [JsonPropertyName("remark")] public string Remark { get; set; } = string.Empty; //备注
    [JsonPropertyName("trade_time")] public string TradeTime { get; set; } = string.Empty; //交易时间（托管台账场景返回入账时间HHmmss）
    [JsonPropertyName("trade_fee")] public string TradeFee { get; set; } = string.Empty; //手续费
    [JsonPropertyName("trade_location")] public string TradeLocation { get; set; } = string.Empty; //交易场所
    [JsonPropertyName("ex_rate")] public string ExRate { get; set; } = string.Empty; //汇率
    [JsonPropertyName("for_currency")] public string ForCurrency { get; set; } = string.Empty; //外币币种
    [JsonPropertyName("en_abstract")] public string EnAbstract { get; set; } = string.Empty; //英文摘要
    [JsonPropertyName("open_bank_no")] public string OpenBankNo { get; set; } = string.Empty; //开户行行号
    [JsonPropertyName("open_bankbic")] public string OpenBankbic { get; set; } = string.Empty; //开户行BIC
    [JsonPropertyName("open_bank_name")] public string OpenBankName { get; set; } = string.Empty; //开户银行名称
    [JsonPropertyName("sub_acct_seq")] public string SubAcctSeq { get; set; } = string.Empty; //账号序号
    [JsonPropertyName("th_currency")] public string ThCurrency { get; set; } = string.Empty; //币种（托管台账场景返回币种）
    [JsonPropertyName("recip_bk_name1")] public string RecipBkName1 { get; set; } = string.Empty; //对方行名（以此为准）
    [JsonPropertyName("recip_bk_no1")] public string RecipBkNo1 { get; set; } = string.Empty; //对方行号（以此为准）
    [JsonPropertyName("t_info_new")] public string TInfoNew { get; set; } = string.Empty; //电子回单唯一标识
    [JsonPropertyName("refund_msg")] public string RefundMsg { get; set; } = string.Empty; //跨行退回原因
    [JsonPropertyName("bus_type_no")] public string BusTypeNo { get; set; } = string.Empty; //回单业务种类
    [JsonPropertyName("receipt_info")] public string ReceiptInfo { get; set; } = string.Empty; //回单个性化信息
    [JsonPropertyName("tel_no")] public string TelNo { get; set; } = string.Empty; //柜员号
    [JsonPropertyName("mdcardno")] public string Mdcardno { get; set; } = string.Empty; //本方财智账户卡卡号（管家卡卡号）
    [JsonPropertyName("tran_serial_no")] public string TranSerialNo { get; set; } = string.Empty; //电子回单流水号
    [JsonPropertyName("media_id")] public string MediaId { get; set; } = string.Empty; //本方介质识别号，目前仅在FOVA账户查询时返回
    [JsonPropertyName("event_serial_no")] public string? EventSerialNo { get; set; } = string.Empty; //关联事件编号
    [JsonPropertyName("sort_field")] public string? SortField { get; set; } = string.Empty; //排序字段
    [JsonPropertyName("info_to_acc_owner")] public string? InfoToAccOwner { get; set; } = string.Empty; //附加信息（ 86项字段，如字段为空则为"" ，返回满位390长度的字段）
    [JsonPropertyName("sub_no")] public string? SubNo { get; set; } = string.Empty; //存款序号：境外存款序号，目前仅在FOVA账户查询时返回
    [JsonPropertyName("matu_date")] public string? MatuDate { get; set; } = string.Empty; //到期日期：fova定期时输出，yyyyMMdd
    [JsonPropertyName("int_rate")] public string? IntRate { get; set; } = string.Empty; //正常利率：fova定期时输出，不带百分号的数字
    [JsonPropertyName("save_term")] public string? SaveTerm { get; set; } = string.Empty; //存期：fova定期时输出
    [JsonPropertyName("save_term_unit")] public string? SaveTermUnit { get; set; } = string.Empty; //存期单位：FOVA定期时输出，定期账号时，输出,存期单位 1-日;2-月;3-年
    [JsonPropertyName("useable_balance")] public decimal? UseableBalance { get; set; }  //可用余额：本行往来户查询历史明细时返回。当设置为多级联动+实时归集时，将返回资金池的可用额度

}
#endregion